package main

import "fmt"

// IF定义了一个接口，包含一个方法getName，用于获取名称信息
type IF interface {
	getName() string
}

// Human结构体表示人的信息，包括firstName和lastName字段
type Human struct {
	firstName, lastName string
}

// Plane结构体表示飞机的信息，包括vendor和model字段
type Plane struct {
	vendor string
	model  string
}

// getName是Human类型的指针方法，返回人的姓名，格式为lastName, firstName
func (h *Human) getName() string {
	return h.firstName + ", " + h.lastName
}

// getName是Plane类型的值方法，返回飞机的厂商和型号信息
func (p Plane) getName() string {
	return fmt.Sprintf("vendor: %s, model: %s", p.vendor, p.model)
}

// Car结构体表示汽车的信息，包括factory和model字段
type Car struct {
	factory, model string
}

// getName是Car类型的指针方法，返回汽车的生产厂家和型号信息
func (c *Car) getName() string {
	return c.factory + ", " + c.model
}

// main函数是程序的入口点
func main() {
	// 初始化一个IF类型的切片，用于存储实现IF接口的对象
	interfaces := []IF{}

	// 创建一个Human实例并设置其属性
	h := new(Human)
	h.firstName = "first"
	h.lastName = "last"
	// 将Human实例添加到切片中
	interfaces = append(interfaces, h)

	// 创建一个Car实例并设置其属性
	c := new(Car)
	c.factory = "benz"
	c.model = "s"
	// 将Car实例添加到切片中
	interfaces = append(interfaces, c)

	// 遍历切片并调用每个元素的getName方法
	for _, f := range interfaces {
		fmt.Println(f.getName())
	}

	// 创建一个Plane实例并设置其属性
	p := Plane{}
	p.vendor = "testVendor"
	p.model = "testModel"
	// 调用Plane实例的getName方法并打印结果
	fmt.Println(p.getName())
}
